package com.itheima.health.service.impl;

import com.itheima.health.common.MessageConst;
import com.itheima.health.dao.OrderDao;
import com.itheima.health.dao.OrderSettingDao;
import com.itheima.health.exception.BusinessRuntimeException;
import com.itheima.health.pojo.Order;
import com.itheima.health.pojo.OrderSetting;
import com.itheima.health.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author ：贝
 * @date ：Created in 2022年06月08日
 * @description ：
 * @version: 1.0
 */
@Service
@Slf4j
public class OrderServiceimpl implements OrderService {
    @Autowired
    private OrderDao orderDao;

    @Override
    public Order findById(Integer id) {
        Order order = orderDao.selectById(id);
        return order;

    }

    /**
     * 1、检查用户所选择的预约日期是否已经提前进行了预约设置，如果没有设置则无法进行预约
     *
     * 2、检查用户所选择的预约日期是否已经约满，如果已经约满则无法预约
     *
     * 3、检查用户是否重复预约（同一个用户在同一天预约了同一个套餐），如果是重复预约则无法完成再次预约
     *
     * 4、预约成功，更新当日的已预约人数
     * @param order
     * @return
     */
    @Autowired
    private OrderSettingDao orderSettingDao;
    @Transactional
    @Override
    public Order add(Order order) {
        log.info("[预约]data:{}",order);

        //1、查询预约设置信息
        OrderSetting orderSetting = orderSettingDao.selectByOrderDate(order.getOrderDate());
        //日期是参数order里面从前端带过来的，这里拿过来去跟数据库信息对比
        if (null == orderSetting){
            //如果不存在-不能预约
            throw new BusinessRuntimeException(MessageConst.SELECTED_DATE_CANNOT_ORDER);
        }else if(orderSetting.getReservations()>=orderSetting.getNumber()){
            //2、如果存在-且约满
            throw new BusinessRuntimeException(MessageConst.ORDER_FULL);
        }
        //3、查询是否有重复预约  同一个人同一天同一个套餐
        long count = orderDao.countByMemberAndDateAndSetMeal(order.getMemberId(),order.getOrderDate(),order.getSetmealId());
        if(count>0){
            throw new BusinessRuntimeException(MessageConst.HAS_ORDERED);
        }
        //4、插入数据
        orderDao.insert(order);

        //修改已预约数
        orderSettingDao.updateReservationsById(orderSetting.getId(),orderSetting.getReservations()+1);

        return orderDao.selectById(order.getId());
    }
}
